package com.ldkj.panzh.param;

import lombok.Data;

import java.util.List;

/**
 * 查询门禁点列表v2 参数
 *
 * @author qiancheng
 * @date 2025-11-18
 */
@Data
public class DoorSearchParam extends BaseParam {

    /**
     * 门禁点名称（模糊查询）
     * 最大长度 32（中文按 UTF-8 字节计数）
     * 可选项
     */
    private String name;

    /**
     * 区域编号列表（regionIndexCode）
     * 可为空
     * 支持批量查询，最大 1000 个
     * 单个长度 <= 64 字节
     * 可从“查询区域列表 v2”接口获取
     */
    private List<String> regionIndexCodes;

    /**
     * 是否包含子区域
     * true：查询 regionIndexCodes 及其所有子区域
     * false：仅查询 regionIndexCodes
     */
    private Boolean isSubRegion;

    /**
     * 当前页码（默认值：1）
     */
    private Integer pageNo = 1;

    /**
     * 分页大小（默认值：1000，获取所有数据）
     */
    private Integer pageSize = 1000;

    /**
     * 权限码集合（authCodes）
     * 用于过滤具有某些权限的门禁点
     * 例如：["view"]
     */
    private List<String> authCodes;

    /**
     * 查询表达式列表
     * 支持：=、>=、<=、in、not in、between、like 等
     */
    private List<Expression> expressions;

    /**
     * 排序字段
     * 注意：排序字段必须是查询条件中的某一字段，否则接口报错
     */
    private String orderBy;

    /**
     * 排序方式
     * asc：升序
     * desc：降序
     */
    private String orderType;

    /**
     * 查询表达式对象
     * 用于构建灵活筛选条件
     */
    @Data
    public static class Expression {

        /**
         * 资源属性名
         * 支持：updateTime、createTime、status、parentIndexCodes、
         * resourceIndexCodes、comId、installLocation、channelNo、
         * channelType、cascadeCode、externalIndexCode、deviceCode、
         * ip、treatyType、devSerialNum、deviceModel、deviceType、
         * manufacturer 等字段
         */
        private String key;

        /**
         * 操作符：
         * 0：=
         * 1：>=
         * 2：<=
         * 3：in
         * 4：not in
         * 5：between
         * 6：like
         * 7：pre like
         * 8：suffix like
         */
        private Integer operator;

        /**
         * 查询值列表
         * - =, >=, <=, like：values 只能有 1 个
         * - in, not in：values 可多个（<=20）
         * - between：仅支持整形或日期
         */
        private List<String> values;
    }
}
